0c46a24538c6407b2ec58779cc9f76bbaace2d32,src/com/limelight/nvstream/rtsp/SdpGenerator.java,SdpGenerator,generateSdpFromContext,#ConnectionContext#,89

Before Change


		// settle on the optimal bitrate if it's somewhere in the middle), so we'll just latch the bitrate
		// to the requested value.
		addSessionAttribute(config, "x-nv-vqos[0].bw.minimumBitrate", ""+bitrate);
		addSessionAttribute(config, "x-nv-vqos[0].bw.maximumBitrate", ""+bitrate);
		
		// Using FEC turns padding on which makes us have to take the slow path
		// in the depacketizer, not to mention exposing some ambiguous cases with

After Change


			// settle on the optimal bitrate if it's somewhere in the middle), so we'll just latch the bitrate
			// to the requested value.
			addSessionAttribute(config, "x-nv-vqos[0].bw.minimumBitrate", ""+bitrate);
			addSessionAttribute(config, "x-nv-vqos[0].bw.maximumBitrate", ""+bitrate);
		}
		
		// Using FEC turns padding on which makes us have to take the slow path
		// in the depacketizer, not to mention exposing some ambiguous cases with
		// distinguishing padding from valid sequences. Since we can only perform
		// execute an FEC recovery on a 1 packet frame, we'll just turn it off completely.
		addSessionAttribute(config, "x-nv-vqos[0].fec.enable", "0");
		
		addSessionAttribute(config, "x-nv-vqos[0].videoQualityScoreUpdateTime", "5000");
		
		if (context.streamConfig.getRemote()) {
			addSessionAttribute(config, "x-nv-vqos[0].qosTrafficType", "0");
		}
		else {
			addSessionAttribute(config, "x-nv-vqos[0].qosTrafficType", "5");
		}
		
		if (context.streamConfig.getRemote()) {
			addSessionAttribute(config, "x-nv-aqos.qosTrafficType", "0");
		}
		else {
			addSessionAttribute(config, "x-nv-aqos.qosTrafficType", "4");
		}
		
		// Add generation-specific attributes
		switch (context.serverGeneration) {
		case ConnectionContext.SERVER_GENERATION_3:
			addGen3Attributes(config, context);
			break;
			
		case ConnectionContext.SERVER_GENERATION_4:
			addGen4Attributes(config, context);
			break;
		case ConnectionContext.SERVER_GENERATION_5:
		default:
			addGen5Attributes(config, context);
			break;
		}
		
		// Gen 4+ supports H.265 and surround sound
		if (context.serverGeneration >= ConnectionContext.SERVER_GENERATION_4) {
			// If client and server are able, request HEVC
			if (context.negotiatedVideoFormat == VideoFormat.H265) {
				addSessionAttribute(config, "x-nv-clientSupportHevc", "1");
				addSessionAttribute(config, "x-nv-vqos[0].bitStreamFormat", "1");
				
				// Disable slicing on HEVC
				addSessionAttribute(config, "x-nv-video[0].videoEncoderSlicesPerFrame", "1");
			}
			else {
				// Otherwise, use AVC
				addSessionAttribute(config, "x-nv-clientSupportHevc", "0");
				addSessionAttribute(config, "x-nv-vqos[0].bitStreamFormat", "0");
				
				// Use slicing for increased performance on some decoders
				addSessionAttribute(config, "x-nv-video[0].videoEncoderSlicesPerFrame", "4");
			}
			
			// Enable surround sound if configured for it
			addSessionAttribute(config, "x-nv-audio.surround.numChannels", ""+context.streamConfig.getAudioChannelCount());
			addSessionAttribute(config, "x-nv-audio.surround.channelMask", ""+context.streamConfig.getAudioChannelMask());
			if (context.streamConfig.getAudioChannelCount() > 2) {
				addSessionAttribute(config, "x-nv-audio.surround.enable", "1");
			}
			else {
				addSessionAttribute(config, "x-nv-audio.surround.enable", "0");